const fs = require('fs').promises;
const path = require('path');

// 配置参数
const CONFIG = {
  outputFile: path.join(__dirname, 'data.json'),
  highOrbitSatellites: 2,        // 高轨卫星数量
  lowOrbitSatellites: 20,        // 低轨卫星数量（id=11~20）
  baseStations: 20,              // 地面基站数量（id=21~40）
  highOrbitY: [100, -100],       // 高轨卫星Y坐标
  lowOrbitY: [200, -200],        // 低轨卫星Y坐标（上下半区）
  baseStationYs: [100, 300, -100, -300] // 基站Y坐标分层
};

// 生成卫星网络数据
async function generateSatelliteNetwork() {
  try {
    // 1. 生成高轨卫星（id=1~2）
    const highOrbit = generateHighOrbit();
    
    // 2. 生成低轨卫星（id=11~20）
    const lowOrbit = generateLowOrbit();
    
    // 3. 生成地面基站（id=21~40）
    const baseStations = generateBaseStations();
    
    // 4. 生成连接关系（基于距离）
    const links = generateLinks(highOrbit, lowOrbit, baseStations);
    
    // 5. 合并数据
    const data = {
      nodes: [...highOrbit, ...lowOrbit, ...baseStations],
      links: links
    };
    
    // 6. 保存文件
    await saveToFile(data);
    console.log('数据已按就近原则生成！');
    
  } catch (error) {
    console.error('生成失败:', error);
  }
}

// 生成高轨卫星（id=1~2）
function generateHighOrbit() {
  return [
    {
      id: 1,
      name: '高轨卫星1',
      layer: 1,
      x: 0,
      y: CONFIG.highOrbitY[0],
      path: 'icon/卫星.png',
      abstract: '我是高轨卫星1',
      pic: 'icon/卫星.png'
    },
    {
      id: 2,
      name: '高轨卫星2',
      layer: 1,
      x: 0,
      y: CONFIG.highOrbitY[1],
      path: 'icon/卫星.png',
      abstract: '我是高轨卫星2',
      pic: 'icon/卫星.png'
    }
  ];
}

// 生成低轨卫星（id=11~20，上下半区各5颗）
function generateLowOrbit() {
  const upperX = [-200, -100, 1, 100, 200]; // 上半区X坐标
  const lowerX = [-200, -100, 1, 100, 200]; // 下半区X坐标
  
  // 上半区低轨卫星（id=11~15）
  const upperSatellites = upperX.map((x, index) => ({
    id: 11 + index,
    name: `低轨卫星${index+1}`,
    layer: 2,
    x: x,
    y: CONFIG.lowOrbitY[0],
    path: 'icon/卫星.png',
    abstract: `我是低轨卫星${index+1}`,
    pic: 'icon/卫星.png'
  }));
  
  // 下半区低轨卫星（id=16~20）
  const lowerSatellites = lowerX.map((x, index) => ({
    id: 16 + index,
    name: `低轨卫星${index+6}`,
    layer: 2,
    x: x,
    y: CONFIG.lowOrbitY[1],
    path: 'icon/卫星.png',
    abstract: `我是低轨卫星${index+6}`,
    pic: 'icon/卫星.png'
  }));
  
  return [...upperSatellites, ...lowerSatellites];
}

// 生成地面基站（id=21~40）
function generateBaseStations() {
  const baseStations = [];
  let baseId = 21;
  
  // 每个Y层生成5个基站（共4层，20个基站）
  CONFIG.baseStationYs.forEach(y => {
    const xs = [-200, -100, 1, 100, 200]; // 每层X坐标
    
    xs.forEach(x => {
      baseStations.push({
        id: baseId++,
        name: `地面基站${baseId - 21}`,
        layer: 3,
        x: x,
        y: y,
        path: 'icon/基站.png',
        abstract: `我是地面基站${baseId - 21}`,
        pic: 'icon/基站.png'
      });
    });
  });
  
  return baseStations;
}

// 生成连接关系（基于距离）
function generateLinks(highOrbit, lowOrbit, baseStations) {
  const links = [];
  
  // 1. 高轨-低轨连接（上半区连高轨1，下半区连高轨2）
  lowOrbit.forEach(low => {
    const highId = low.y > 0 ? 1 : 2; // 根据Y坐标决定连接哪个高轨
    links.push({ source: highId, target: low.id, layer: 4 });
  });
  
  // 2. 低轨-基站连接（就近原则）
  baseStations.forEach(base => {
    const nearestLow = findNearestLowOrbit(base, lowOrbit);
    links.push({ source: nearestLow.id, target: base.id, layer: 4 });
  });
  
  return links;
}

// 查找最近的低轨卫星
function findNearestLowOrbit(base, lowOrbits) {
  return lowOrbits.reduce((nearest, current) => {
    const nearestDist = distance(base, nearest);
    const currentDist = distance(base, current);
    return currentDist < nearestDist ? current : nearest;
  });
}

// 计算两点距离
function distance(node1, node2) {
  return Math.sqrt(Math.pow(node1.x - node2.x, 2) + Math.pow(node1.y - node2.y, 2));
}

// 保存文件
async function saveToFile(data) {
  await fs.writeFile(
    CONFIG.outputFile,
    JSON.stringify(data, null, 2),
    'utf8'
  );
}

// 执行生成
generateSatelliteNetwork();